const RequestParser = require('./RequestParser');
const makeResponse = require('./makeResponse');
const path = require('path');

const CORSPlugin = require('./CORSPlugin');

const OPTIONSPlugin = require('./OPTIONSPlugin');

const AUTHPlugin = require('./AUTHPlugin');

const CACHEPlugin = require('./CACHEPlugin');

const POSTPlugin = require('./POSTPlugin');
const GETPlugin = require('./GETPlugin');
const PUTPlugin = require('./PUTPlugin');
const DELETEPlugin = require('./DELETEPlugin');


module.exports = (connection) => {
    const parser = new RequestParser();

    // 通过 path 模块，把当前的相对目录转为绝对目录以便访问
    const env = {
        root: path.resolve('./www'),
        session: path.resolve('./session')
    }

    // data事件的触发时机与顺序
    // 时机
    // data的触发只有两处：

    // 流如果处于流动模式 & 缓冲区没有数据 & 异步调用push，此时数据不经过缓冲区，直接触发data事件
    // 不满足上述情况时，push的数据会被放入缓冲区，然后再尝试从缓冲区读取指定size的数据并触发data事件

    connection.on('data', (buffer) => {
        parser.append(buffer);
    });

    parser.on('finish', (message) => {

        // 跨域在鉴权之前
        message = CORSPlugin(message, env);

        message = OPTIONSPlugin(message, env);
        // 鉴权要在 CURD 操作之前
        message = AUTHPlugin(message, env);

        message = CACHEPlugin(message, env);

        message = POSTPlugin(message, env);
        message = GETPlugin(message, env);
        message = PUTPlugin(message, env);
        message = DELETEPlugin(message, env);
        // make reqsonse
        connection.end(makeResponse(message));
    })
}